<!DOCTYPE HTML>
<html lang="zh-CN">


<head>
    <meta charset="utf-8">
    <meta name="keywords" content="用于移动应用程序开发的知识图增强型第三方库推荐, SongX64">
    <meta name="description" content="">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="renderer" content="webkit|ie-stand|ie-comp">
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="baidu-site-verification" content="code-8GV6uhDsco" />
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <!-- Global site tag (gtag.js) - Google Analytics -->


    <title>用于移动应用程序开发的知识图增强型第三方库推荐 | SongX64</title>
    <link rel="icon" type="image/png" href="/favicon.png">

    <link rel="stylesheet" type="text/css" href="/libs/awesome/css/all.css">
    <link rel="stylesheet" type="text/css" href="/libs/materialize/materialize.min.css">
    <link rel="stylesheet" type="text/css" href="/libs/aos/aos.css">
    <link rel="stylesheet" type="text/css" href="/libs/animate/animate.min.css">
    <link rel="stylesheet" type="text/css" href="/libs/lightGallery/css/lightgallery.min.css">
    <link rel="stylesheet" type="text/css" href="/css/matery.css">
    <link rel="stylesheet" type="text/css" href="/css/my.css">

    <script src="/libs/jquery/jquery.min.js"></script>

<meta name="generator" content="Hexo 5.4.0"><link rel="alternate" href="/atom.xml" title="SongX64" type="application/atom+xml">
</head>



   <style>
    body{
       background-image: url(https://gitee.com/songx86/SongPicBed/raw/master/img/fd039245d688d43f5595595b7d1ed21b0ef43b5f.jpg);
       background-repeat:no-repeat;
       background-size:cover;
       background-attachment:fixed;
    }
</style>



<body>
    <header class="navbar-fixed">
    <nav id="headNav" class="bg-color nav-transparent">
        <div id="navContainer" class="nav-wrapper container">
            <div class="brand-logo">
                <a href="/" class="waves-effect waves-light">
                    
                    <img src="/medias/logo.png" class="logo-img" alt="LOGO">
                    
                    <span class="logo-span">SongX64</span>
                </a>
            </div>
            

<a href="#" data-target="mobile-nav" class="sidenav-trigger button-collapse"><i class="fas fa-bars"></i></a>
<ul class="right nav-menu">
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/" class="waves-effect waves-light">
      
      <i class="fas fa-home" style="zoom: 0.6;"></i>
      
      <span>首页</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/tags" class="waves-effect waves-light">
      
      <i class="fas fa-tags" style="zoom: 0.6;"></i>
      
      <span>标签</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/categories" class="waves-effect waves-light">
      
      <i class="fas fa-bookmark" style="zoom: 0.6;"></i>
      
      <span>分类</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/archives" class="waves-effect waves-light">
      
      <i class="fas fa-archive" style="zoom: 0.6;"></i>
      
      <span>归档</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/about" class="waves-effect waves-light">
      
      <i class="fas fa-user-circle" style="zoom: 0.6;"></i>
      
      <span>关于</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/contact" class="waves-effect waves-light">
      
      <i class="fas fa-comments" style="zoom: 0.6;"></i>
      
      <span>留言板</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/friends" class="waves-effect waves-light">
      
      <i class="fas fa-address-book" style="zoom: 0.6;"></i>
      
      <span>友情链接</span>
    </a>
    
  </li>
  
  <li>
    <a href="#searchModal" class="modal-trigger waves-effect waves-light">
      <i id="searchIcon" class="fas fa-search" title="搜索" style="zoom: 0.85;"></i>
    </a>
  </li>
</ul>


<div id="mobile-nav" class="side-nav sidenav">

    <div class="mobile-head bg-color">
        
        <img src="/medias/logo.png" class="logo-img circle responsive-img">
        
        <div class="logo-name">SongX64</div>
        <div class="logo-desc">
            
            Never really desperate, only the lost of the soul.
            
        </div>
    </div>

    

    <ul class="menu-list mobile-menu-list">
        
        <li class="m-nav-item">
	  
		<a href="/" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-home"></i>
			
			首页
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/tags" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-tags"></i>
			
			标签
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/categories" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-bookmark"></i>
			
			分类
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/archives" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-archive"></i>
			
			归档
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/about" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-user-circle"></i>
			
			关于
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/contact" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-comments"></i>
			
			留言板
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/friends" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-address-book"></i>
			
			友情链接
		</a>
          
        </li>
        
        
        <li><div class="divider"></div></li>
        <li>
            <a href="https://github.com/blinkfox/hexo-theme-matery" class="waves-effect waves-light" target="_blank">
                <i class="fab fa-github-square fa-fw"></i>Fork Me
            </a>
        </li>
        
    </ul>
</div>


        </div>

        
            <style>
    .nav-transparent .github-corner {
        display: none !important;
    }

    .github-corner {
        position: absolute;
        z-index: 10;
        top: 0;
        right: 0;
        border: 0;
        transform: scale(1.1);
    }

    .github-corner svg {
        color: #0f9d58;
        fill: #fff;
        height: 64px;
        width: 64px;
    }

    .github-corner:hover .octo-arm {
        animation: a 0.56s ease-in-out;
    }

    .github-corner .octo-arm {
        animation: none;
    }

    @keyframes a {
        0%,
        to {
            transform: rotate(0);
        }
        20%,
        60% {
            transform: rotate(-25deg);
        }
        40%,
        80% {
            transform: rotate(10deg);
        }
    }
</style>

<a href="https://github.com/blinkfox/hexo-theme-matery" class="github-corner tooltipped hide-on-med-and-down" target="_blank"
   data-tooltip="Fork Me" data-position="left" data-delay="50">
    <svg viewBox="0 0 250 250" aria-hidden="true">
        <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
        <path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
              fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
        <path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
              fill="currentColor" class="octo-body"></path>
    </svg>
</a>
        
    </nav>

</header>

    



<div class="bg-cover pd-header post-cover" style="background-image: url('/medias/featureimages/1/12.jpg')">
    <div class="container" style="right: 0px;left: 0px;">
        <div class="row">
            <div class="col s12 m12 l12">
                <div class="brand">
                    <h1 class="description center-align post-title">用于移动应用程序开发的知识图增强型第三方库推荐</h1>
                </div>
            </div>
        </div>
    </div>
</div>




<main class="post-container content">

    
    <link rel="stylesheet" href="/libs/tocbot/tocbot.css">
<style>
    #articleContent h1::before,
    #articleContent h2::before,
    #articleContent h3::before,
    #articleContent h4::before,
    #articleContent h5::before,
    #articleContent h6::before {
        display: block;
        content: " ";
        height: 100px;
        margin-top: -100px;
        visibility: hidden;
    }

    #articleContent :focus {
        outline: none;
    }

    .toc-fixed {
        position: fixed;
        top: 64px;
    }

    .toc-widget {
        width: 345px;
        padding-left: 20px;
    }

    .toc-widget .toc-title {
        padding: 35px 0 15px 17px;
        font-size: 1.5rem;
        font-weight: bold;
        line-height: 1.5rem;
    }

    .toc-widget ol {
        padding: 0;
        list-style: none;
    }

    #toc-content {
        padding-bottom: 30px;
        overflow: auto;
    }

    #toc-content ol {
        padding-left: 10px;
    }

    #toc-content ol li {
        padding-left: 10px;
    }

    #toc-content .toc-link:hover {
        color: #42b983;
        font-weight: 700;
        text-decoration: underline;
    }

    #toc-content .toc-link::before {
        background-color: transparent;
        max-height: 25px;

        position: absolute;
        right: 23.5vw;
        display: block;
    }

    #toc-content .is-active-link {
        color: #42b983;
    }

    #floating-toc-btn {
        position: fixed;
        right: 15px;
        bottom: 76px;
        padding-top: 15px;
        margin-bottom: 0;
        z-index: 998;
    }

    #floating-toc-btn .btn-floating {
        width: 48px;
        height: 48px;
    }

    #floating-toc-btn .btn-floating i {
        line-height: 48px;
        font-size: 1.4rem;
    }
</style>
<div class="row">
    <div id="main-content" class="col s12 m12 l9">
        <!-- 文章内容详情 -->
<div id="artDetail">
    <div class="card">
        <div class="card-content article-info">
            <div class="row tag-cate">
                <div class="col s7">
                    
                    <div class="article-tag">
                        
                            <a href="/tags/%E7%A7%91%E7%A0%94/">
                                <span class="chip bg-color">科研</span>
                            </a>
                        
                            <a href="/tags/Knowledge-Graph/">
                                <span class="chip bg-color">Knowledge Graph</span>
                            </a>
                        
                            <a href="/tags/%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91/">
                                <span class="chip bg-color">论文翻译</span>
                            </a>
                        
                            <a href="/tags/Recommendation/">
                                <span class="chip bg-color">Recommendation</span>
                            </a>
                        
                    </div>
                    
                </div>
                <div class="col s5 right-align">
                    
                    <div class="post-cate">
                        <i class="fas fa-bookmark fa-fw icon-category"></i>
                        
                            <a href="/categories/%E7%A7%91%E7%A0%94/" class="post-category">
                                科研
                            </a>
                        
                    </div>
                    
                </div>
            </div>

            <div class="post-info">
                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-minus fa-fw"></i>发布日期:&nbsp;&nbsp;
                    2021-02-23
                </div>
                

                

                
                <div class="info-break-policy">
                    <i class="far fa-file-word fa-fw"></i>文章字数:&nbsp;&nbsp;
                    8.1k
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-clock fa-fw"></i>阅读时长:&nbsp;&nbsp;
                    28 分
                </div>
                

                
            </div>
        </div>
        <hr class="clearfix">

        
        <!-- 是否加载使用自带的 prismjs. -->
        <link rel="stylesheet" href="/libs/prism/prism.css">
        

        

        <div class="card-content article-card-content">
            <div id="articleContent">
                <h1 id="用于移动应用程序开发的知识图增强型第三方库推荐"><a href="#用于移动应用程序开发的知识图增强型第三方库推荐" class="headerlink" title="用于移动应用程序开发的知识图增强型第三方库推荐"></a>用于移动应用程序开发的知识图增强型第三方库推荐</h1><p>Knowledge Graph Enhanced Third-Party Library Recommendation for Mobile Application Development</p>
<h2 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h2><h3 id="问题："><a href="#问题：" class="headerlink" title="问题："></a>问题：</h3><p>移动应用市场变得越来越繁荣。第三方库在移动应用程序开发中发挥了至关重要的作用。这些库可以缩短开发时间，提高开发效率并提高开发质量。当前，已经发布了<strong>大量第三方库</strong>，这给开发人员选择适当的库带来了沉重的负担。</p>
<h3 id="方法："><a href="#方法：" class="headerlink" title="方法："></a>方法：</h3><p>针对这一问题，在本文中，我们通过<strong>集成主题建模和知识图技术</strong>提出了一种新颖的第三方库推荐方法。</p>
<ul>
<li><p>在主题建模组件中，我们从文本应用程序描述中提取主题，并根据与新应用程序共享相似主题的应用程序使用的库提出建议。</p>
</li>
<li><p>在知识图组件中，我们利用知识图来整合第三方库和应用程序的结构化信息，以及推荐应用程序和库的交互信息。</p>
</li>
</ul>
<h3 id="结果："><a href="#结果：" class="headerlink" title="结果："></a>结果：</h3><p>在真实数据集上进行的实验表明，在推荐效果方面，我们提出的方法优于几种最先进的方法。</p>
<h2 id="关键词"><a href="#关键词" class="headerlink" title="关键词"></a>关键词</h2><p>第三方库推荐，移动应用，知识图，主题建模，MKR。</p>
<h2 id="1-简介"><a href="#1-简介" class="headerlink" title="1.简介"></a>1.简介</h2><h3 id="背景问题："><a href="#背景问题：" class="headerlink" title="背景问题："></a>背景问题：</h3><p>移动应用开发，第三方库在移动应用程序开发中可以发挥至关重要的作用，这是因为通过重复使用它们可以显着提高开发质量和生产率。如何从大量复杂的第三方库中选择满足需求的库，成为移动应用程序开发中的一个难题。</p>
<h3 id="现有研究："><a href="#现有研究：" class="headerlink" title="现有研究："></a>现有研究：</h3><p>近年来，研究人员为第三方图书馆推荐提出了一些方法[1] – [5]。这些方法主要集中在**关联规则挖掘[6]，标签信息和主题模型方法[7]**的使用上。</p>
<h3 id="仍存缺点："><a href="#仍存缺点：" class="headerlink" title="仍存缺点："></a>仍存缺点：</h3><p>但是，现有方法仅利用一些粗粒度的辅助信息，例如<strong>分类和主题，无法捕获应用程序和第三方库的结构化潜在知识级连接</strong>。结果，开发人员无法发现新的库和未直接关联的库。这不仅限制了开发人员使用的库的狭窄范围，而且还阻碍了第三方库的开发和发展。</p>
<h3 id="提出方法："><a href="#提出方法：" class="headerlink" title="提出方法："></a>提出方法：</h3><p>在这项工作中，我们提出了一种混合知识图增强库推荐方法TM-MKR，</p>
<p>它由两个主要部分组成：==主题建模组件==和==知识图组件==。</p>
<ul>
<li>在主题建模（TM）组件中，我们使用LDA [8]模型，该模型将应用程序和库的文本描述作为输入来计算它们的相似性。</li>
<li>在知识图组件中，根据第三方库推荐的特定情况，通过引入应用程序和第三方库的知识图，我们可以自定义MKR [9]以获取基于用户的MKR（U-MKR）和基于项目的MKR（I-MKR）。</li>
</ul>
<h3 id="主要工作"><a href="#主要工作" class="headerlink" title="主要工作"></a>主要工作</h3><p>我们的主要贡献如下：</p>
<ul>
<li>我们==构造了一个大规模的领域知识图==，以获得应用程序和库之间的语义级别关联。</li>
<li>我们提出了一种==混合推荐方法==，该方法基于应用程序和库的交互信息，描述和结构化语义信息，将主题建模和知识图相结合。</li>
<li> 我们对真实数据集进行实验，并将我们提出的方法与几种最新方法进行比较。实验结果证明了我们的TM-MKR方法的有效性。</li>
</ul>
<h3 id="论文结构"><a href="#论文结构" class="headerlink" title="论文结构"></a>论文结构</h3><p>本文的其余部分安排如下。</p>
<ol start="2">
<li>第二部分回顾了图书馆推荐系统和基于KG的推荐中的一些相关工作。</li>
<li>第三节介绍了初步情况。</li>
<li>第四节介绍了建议的知识图增强图书馆推荐系统。</li>
<li>在第五节中讨论了实验和结果。</li>
<li>最后，在本文的末尾给出了未来工作的结论和方向。</li>
</ol>
<h2 id="2-相关工作"><a href="#2-相关工作" class="headerlink" title="2.相关工作"></a>2.相关工作</h2><h3 id="A-第三方库推荐"><a href="#A-第三方库推荐" class="headerlink" title="A.第三方库推荐"></a>A.第三方库推荐</h3><p>到目前为止，已经提出了许多与第三方库推荐有关的作品。</p>
<ol>
<li><p>较早的API建议大多使用模式挖掘和匹配。</p>
<ul>
<li>例如，PROSPECTOR是一种基于API方法签名和从样本客户端程序的语料库中挖掘出来的杂类的工具[10]，</li>
<li>而MAPO是一种工具，可以自动挖掘API使用模式，并根据程序员的要求进一步推荐已开采的API使用模式及其相关的代码段[11]。</li>
</ul>
<p>这些方法用于在特定情况下推荐。</p>
</li>
<li><p>之后，Thung等提出了一种将关联规则挖掘与推荐方法相结合的混合方法。他们利用基于一组库使用模式的关联规则挖掘组件，以及基于其他类似项目使用的库进行协作筛选来提出建议。</p>
</li>
<li><p>近年来，许多研究建议通过将协作式过滤与基于内容的方法相结合来推荐该库。</p>
<ul>
<li>AppLibRec [4]，[5]结合了LDA和协作过滤，以推荐用于软件开发的第三方库列表，其中LDA是一种生成概率模型，用于从文本语料库中提取关键字。    </li>
<li>Chen等提出了一种基于从Stack Overflow问题中提取的标签信息推荐库的新方法。他们利用词嵌入技术以及特定于领域的关系和类别知识来实现类比库推荐[1]，[2]。</li>
</ul>
</li>
</ol>
<p>从这些推荐方法的开发中，我们可以看到库级别的开发正受到开发人员的更多关注。</p>
<p>我们的方法从库级别的粒度为移动应用程序的开发人员提供了建议。它不仅利用了==应用程序及其相应的第三方库的交互作用，而且还依赖于应用程序的文本描述==。更重要的是，我们利用==知识图结合了移动应用程序和第三方库的结构化语义信息==。</p>
<h3 id="B-知识图"><a href="#B-知识图" class="headerlink" title="B.知识图"></a>B.知识图</h3><p>近年来，知识图在推荐器系统中的使用引起了越来越多的关注。研究人员已经提出了知识图，包括诸如DBpedia，YAGO，NELL，DeepDive，BabelNet，ConceptNet等学术项目，以及一些商业项目，例如Microsoft的Satori和Google的知识图。</p>
<p>将==知识图引入推荐系统的两种主要方法==是</p>
<ul>
<li><p>基于路径的方法[12]，[15]-[17]</p>
</li>
<li><p>基于嵌入的方法[13]，[14]，[18]，[19]。</p>
</li>
</ul>
<p>它已被应用在许多场景中，例如</p>
<ul>
<li>新闻推荐[13]，</li>
<li>音乐推荐[20]，</li>
<li>论文推荐[21]，</li>
<li>问题解答[22]，</li>
<li>文本分类[23]，</li>
<li>社区检测[24]，</li>
<li>机器阅读[25] 。</li>
</ul>
<p>在本文中，我们将其应用于第三方库推荐。利用基于嵌入的方法，将知识图与推荐任务相结合，以充分利用应用程序和库的丰富语义信息。</p>
<h2 id="3-基础知识"><a href="#3-基础知识" class="headerlink" title="3.基础知识"></a>3.基础知识</h2><p>在本节中，我们介绍一些与工作有关的初步知识</p>
<h3 id="A-LDA"><a href="#A-LDA" class="headerlink" title="A. LDA"></a>A. LDA</h3><p>潜在狄利克雷分配（LDA）[8]是一种生成统计模型，在自然语言处理中包含单词，主题和文档的三层结构。</p>
<p>LDA是一种无监督的机器学习技术，可用于识别隐藏在大规模文档集合或语料库中的主题信息。</p>
<p>在LDA中，每个文档都可以视为各种主题的混合，其中每个文档都被视为具有通过LDA分配给它的一组主题。</p>
<p>对于由长度为$N_i$的M个文档组成的主体D，LDA假定以下生成过程：</p>
<ol>
<li>选择$θ_i∼ Dir（α）$，其中 $i∈{1，……，M}$，和Dir（α）是典型具有稀疏（α&lt;1）的对称参数α的狄利克雷分布</li>
<li>选择$ϕk∼ Dir（β）$，其中$k∈{1，…… ，K}$，而β是稀疏的</li>
<li>对于每个单词位置$i，j$，其中 $i∈{1，……，M}$ 和 $j∈{1，……，N_i}$：<br>a）选择一个主题$z_{i，j}〜多项式（θ_i）$。<br>b）选择单词$w_{i，j}〜多项式（ϕ_{z_i}，j）$。</li>
</ol>
<p>可以根据以下公式获得文档的单词分布的最大似然估计：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201204204941878.png" alt="公式1-最大似然估计公式"></p>
<p>最后，可以通过诸如吉布斯采样之类的方法来估计模型中的参数。</p>
<h3 id="B-知识图谱嵌入"><a href="#B-知识图谱嵌入" class="headerlink" title="B.知识图谱嵌入"></a>B.知识图谱嵌入</h3><p>知识图嵌入（KGE）的目标是学习每个实体和关系的低维表示向量，该向量保留原始知识图的结构信息。</p>
<p>近年来提出的KGE方法可以大致分为两类：</p>
<ul>
<li>语义匹配模型[27]，[28]<ul>
<li>HolE [27]</li>
<li>ANALOGY [28]</li>
</ul>
</li>
<li>翻译距离模型[29]-[32]<ul>
<li>TransE [29]</li>
<li>TransH [30]</li>
<li>TransD [31]</li>
<li>TransR [32]</li>
</ul>
</li>
</ul>
<p>由于性能优越，最近广泛使用了诸如TransE [29]，TransH [30]，TransD [31]，TransR [32]，HolE [27]和ANALOGY [28]等KGE方法。</p>
<p>在我们的工作中，我们使用的KGE方法是MKR [9]中提出的深度语义匹配体系结构。具体过程如图1所示。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201204205323199.png" alt="图1-MKR中的KGE处理"></p>
<p>对于给定的三元组$（h,r,t）$，头部的$h$的原始特征向量由$L$个交叉压缩单元$C^L$处理。<br>该过程描述如下。对于每一个 $v$ 和一个与其相关联的实体 $e$ ，我们从第 $l$ 层构造其潜在特征$v_l$和  $e_l$ 的成对交互：<br><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205092147009.png" alt="公式2"></p>
<p>其中$C_l$是$l$层的交叉特征矩阵。通过将交叉特征矩阵投影到它们的潜在表示空间中，可以获得下一层的项目和实体的特征向量：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201204210144168.png" alt="公式3"></p>
<p>其中 $w_l$ 和 $b_l$ 是可训练的权重trainable weight和偏差向量bias vectors。</p>
<p>关于关系r，其原始特征向量由L层多层感知（MLP）处理：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205092107682.png" alt="公式4"></p>
<p>其中M（x）=σ（Wx + b）是具有权重W，偏差b和非线性激活函数σ（.）的全连接的神经网络层。然后将它们的潜在特征连接在一起，然后是用于预测尾部t的K层MLP：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205092544213.png" alt="公式5"></p>
<p>其中S（h）是实体h的关联项的集合， $\hat{t}$ 是尾部t的预测向量。最后，得分函数定义为：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205093051722.png" alt="公式6"></p>
<p>其中σ（.）是归一化内积</p>
<h2 id="4-提出方法"><a href="#4-提出方法" class="headerlink" title="4.提出方法"></a>4.提出方法</h2><p>在本节中，我们将详细介绍我们提出的TM-MKR方法。我们首先介绍整个框架，然后讨论主题建模和知识图组件。最后，这两个部分由一个聚合器单元合并。</p>
<h3 id="A-问题定义"><a href="#A-问题定义" class="headerlink" title="A. 问题定义"></a>A. 问题定义</h3><p>我们在本文中定义我们的推荐问题如下。<br>例如，在典型情况下，开发人员想要开发3D赛车游戏，他在GitHub上创建了一个项目，并在README文件中详细介绍了功能说明。现在，根据他的==历史习惯==，我们可以推荐他在其他项目中常用的一些库，例如“ React Native”，“ okHttp”和“ Realm”。根据==README文件的文字描述==，我们可以找到一些==类似的游戏应用程序项目==，并且这些项目中使用的库可以用作建议，例如排行榜的“ Google游戏”，多人支持和云存储，以及用于游戏的“ Unity 3D”。创建交互式3D内容。在项目开发和迭代的过程中，我们还可以根据==已调用的库==推荐相关的库。库推荐的示意图如图2所示。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205093821934.png" alt="图2-库推荐示意图"></p>
<p>更正式地说，我们有一组M个应用程序A = {a1，a2，…。 。 。 ，aM}和一组有一组M个应用程序A = {a1，a2，…。 。 。 ，aM}和一组N个库L = {l1，l2，…。 。 。 ，lN}。</p>
<p>根据应用程序对库的调用信息，定义的应用程序与库的交互矩阵 $Y∈R^{M×N}$ ，其中 $y_{al} = 1$ 表示应用程序调用了库l；否则 $y_{al}=0$。</p>
<p>对于每个应用程序和库，还使用它们的描述性信息。所有这些描述构成了主体D。</p>
<p>此外，我们介绍了由实体和关系三元组组成的应用程序和库的知识图G。每个三元组（h，r，t）表示一个事实，即从头实体h到尾实体t之间存在关系r。</p>
<p>例如，三元组（Twitter工具包，TAGGED_WITH，在线服务）指出，“ Twitter工具包”库被标记为“在线服务”。</p>
<p>在我们的图书馆推荐方案中，交互矩阵中的每个应用程序和图书馆都与知识图中的一个实体相关联。</p>
<p>给定一个交互矩阵Y，一个语料库D和一个知识图G，我们的目标是找到可能与要开发的应用程序相关的前N个库。</p>
<h3 id="B-框架"><a href="#B-框架" class="headerlink" title="B. 框架"></a>B. 框架</h3><p>对于应用程序和库，我们不仅具有其非结构化的文本描述，还具有结构化的语义信息。</p>
<p>在这些==文字描述==中，直接描述了应用程序和库的功能。我们可以使用主题建模技术对其进行处理，以找到推荐的相似库和应用程序。</p>
<p>对于==结构化语义信息==，它在应用程序和库之间包含一些潜在的关联。我们可以利用知识图进行处理，并找到一些必要但不直接相关的建议库。但是主题建模技术和基于知识图的方法都无法同时充分利用所有信息，因此我们考虑使用混合方法来集成这两种技术。</p>
<p>在我们的工作中，我们选择LDA处理文本描述，选择MKR处理结构化语义信息。</p>
<p>我们提出的TM-MKR方法的框架如图3所示。</p>
<p>==它由三个主要组件组成：一个LDA模块，一个MKR模块和一个聚合器单元。==</p>
<p>左侧的LDA模块将应用程序 $a$ 的描述性信息 $d_a$ 和库 $l$ 作为输入，并获得评分得分 $S_{LDA}$。</p>
<p>右侧的MKR模块将应用程序 $a$ 和库 $l$ 作为输入，并获得评分分数 $S_{MKR}$。</p>
<p>最终，聚合器单元通过组合 $S_{LDA}$ 和 $S_{MKR}$ 来计算 $l$ 的最终评分S。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205095130264.png" alt="图3-提出的库推荐方法的框架。"></p>
<h3 id="C-LDA模型"><a href="#C-LDA模型" class="headerlink" title="C. LDA模型"></a>C. LDA模型</h3><p>LDA模块的详细信息显示在图3的左侧。</p>
<p>此模块的过程描述如下。我们首先对==应用程序和库的描述性信息==进行预处理，例如tokenization（即删除停用词，标点和低频词）和stemming。然后我们设置一些参数以开始训练。通常，主题数的适当值为200到500。</p>
<p>训练后，获得LDA模型，可以为每个描述d生成主题分布向量 $θ_d$。</p>
<p>我们将 $θ_d$ 表示为：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205095515926.png" alt="公式7-θ_d的表示"></p>
<p>其中 $t_i（i∈{1,2，…，T}）$是文档d中第i个主题的比例，T是训练语料库D的所有主题的数量。</p>
<p>对于给定的新应用程序a，我们使用LDA模型将其文本描述 $d_a$ 转换为主题向量$θ_{d_a}$，然后==计算该主题向量（新给定的应用程序a转换后的向量）与训练应用程序的主题向量之间的距离==。我们考虑余弦相似度来确定两个向量的相似度：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205095855122.png" alt="公式8-余弦相似度"></p>
<p>其中·表示点积，||θ|| 表示主题向量的大小。</p>
<p>最后，我们计算由LDA模块获得的得分 $S_{LDA}$。我们选择余弦相似度得分最高的前k个应用，其描述文件 $d_a$ 作为邻近  N（a）= {a1，a2，。 。 。 ，ak}用于新应用程序。 $ l$ 的分数定义为：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205100704459.png" alt="公式9-SLDA分数的计算"></p>
<p>SLDA（1）的范围是0到1。</p>
<p>（这里应该是 $y_{a_il}$, l也是下标：y_{a_il} )</p>
<blockquote>
<p>==也就是说左面的LDA模型，求得是新给出的应用程序a的文本描述，与原来库中所训练的老应用程序θ的文本描述的相似度。得出前k个相似的程序。然后最终得出的分数相当于，库l在这k个程序中使用程度，也就是库l可能在a中的使用概率。==</p>
<p>公式9中的，</p>
<ul>
<li><p>k: 余弦相似度得分最高的前k个应用；</p>
</li>
<li><p> $y_{a_il}$ ：根据应用程序对库的调用信息，定义的应用程序与库的交互矩阵 $Y∈R^{M×N}$ ，其中 $y_{al} = 1$ 表示应用程序调用了库l；否则 $y_{al}=0$。就是第i个$y_{al}$</p>
</li>
<li><p>最后得分，是针对某个库 $l$ 的，也就是说输入的那个库 $l$ 得分为 $S_{LDA}(l)$ </p>
</li>
</ul>
</blockquote>
<h3 id="D-MKR模型"><a href="#D-MKR模型" class="headerlink" title="D.MKR模型"></a>D.MKR模型</h3><p>该模块基于深层的端到端框架MKR [16]，其结构如图3的右侧所示。</p>
<p>在将应用程序 $a$ 和库 $l$ 转换为==原始特征向量==后，将其作为输入。 我们使用L层MLP（多层感知器）提取应用的潜在浓缩特征 $a_L$ ：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205100955402.png" alt="公式10-提取特征aL"></p>
<p>L个交叉压缩单元与KGE模块一起处理库，以提取其特征 $l_L $，如第三部分所示：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205101101262.png" alt="公式11-提取特征l_L"></p>
<p>其中S（l）是库l的关联实体的集合。</p>
<p>在获得应用程序的潜在特征 $a_L$ 和库的潜在特征 $l_L$ 后，我们通过函数 $f_{RS}$（例如一个内积或MLP多层感知器）将它们组合在一起。库和应用的最终分数为：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205101448504.png" alt="公式12-最终分数SMKR"></p>
<p>其中σ（。）是非线性激活函数。</p>
<p>在这项工作中，我们分别利用应用程序和库的知识图嵌入定制MKR以获得==U-MKR和I-MKR==。</p>
<p>==以上是I-MKR的结构==。</p>
<p>对于==U-MKR==，我们交换处理应用程序和库的过程：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205101622586.png" alt="公式13-UMKR的公式"></p>
<p>其中S（a）是应用程序a的关联实体的集合。最终分数的公式与I-MKR相同。</p>
<h3 id="E-聚合器单元"><a href="#E-聚合器单元" class="headerlink" title="E.聚合器单元"></a>E.聚合器单元</h3><p>聚合器单元通过结合SLDA和SMKR来获得推荐分数。对于每个库，推荐分数S定义为：</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205101731373.png" alt="公式14-聚合器单元最终得分"></p>
<p>其中0≤α≤1。最后，我们选择得分最高的前N个库作为对开发人员的建议。</p>
<h2 id="5-实验及结果"><a href="#5-实验及结果" class="headerlink" title="5.实验及结果"></a>5.实验及结果</h2><p>在本节中，我们将对从AppBrain10爬取的真实数据集进行一系列实验，以将我们提出的方法与几种最新方法进行比较。所有实验程序都是用Python开发的，是在运行Windows 10操作系统，配备Intel Core 4 CPU i7-4710HQ，@ 2.5 GHz和8GB RAM的PC上进行的。</p>
<h3 id="A-数据集"><a href="#A-数据集" class="headerlink" title="A.数据集"></a>A.数据集</h3><p>AppBrain是领先的移动广告网络，可提供针对Android市场的独特的按安装付费的应用程序推广服务。 AppBrain的目的是为开发人员提供一种快速简便的方法来扩展其应用程序的范围以及发展和发展其业务。它包含有关应用程序和相应的第三方库的大量信息。为了评估所提出的TM-MKR方法的性能，我们从AppBrain抓取了一个数据集。因为我们只对调用至少一个库的应用程序感兴趣，所以为了方便工作而弃用了某些应用程序。</p>
<p>==过滤后的数据集由5,274个应用程序和471个库组成，其中每个应用程序都具有名称，包装，价格，大小，版本，描述等属性，每个库都通过其名称，描述，类型，标签等来表征==。</p>
<p>表1显示了数据集中的一个应用程序和一个库，其中“伦敦实时公交时间-TfL Buses”是一个交通应用程序，它调用了“ Admob”和“ Twitter Kit”之类的库。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205103017009.png" alt="表1.数据集中的应用程序和库的示例。"></p>
<p>经典推荐任务中最重要的部分是用户和项目之间的交互信息。同样，在我们的工作中，我们还需要==应用程序和库之间的交互信息，即数据集中包含的应用程序和库之间的调用关系==。表2总结了数据集的统计信息。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205102953553.png" alt="表2.数据集的统计信息"></p>
<p>为了评估推荐效果，我们基于抓取的数据集为每个实验构建了训练集和测试集。我们将数据集随机分为训练集和测试集，以便==训练集包含70％的数据，而测试集包含30％==。</p>
<h3 id="B-知识图谱"><a href="#B-知识图谱" class="headerlink" title="B.知识图谱"></a>B.知识图谱</h3><p>对于知识图的构建，我们利用应用程序和库的爬取的结构化信息。</p>
<p>首先，我们区分数据集中的知识实体。基于这些实体，我们提取所有由主题，谓词及其宾语组成的三元组。主语和宾语是谓词定义的关系中涉及的实体。提取三元组之后，这些数据将存储在图形数据库Neo4j11中，以备后用。</p>
<p>最后，我们有一个9,820个实体和85,306个关系的知识图。表3汇总了知识图的详细统计信息。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205102924183.png" alt="表3.知识图的统计量"></p>
<p>Neo4j中存储的库“ Twitter Kit”的三元组结构（我们仅选择了所有三元组中的十个）如图4所示。</p>
<p>前面提到的三元组（Twitter Kit，TAGGED_WITH，在线服务）现在表示为两个节点。通过定向边缘连接。绿色节点“ Twitter套件”是实体“库”，蓝色节点“在线服务”是实体“标签”，边缘是关系“ TAGGED_WITH”。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205103131939.png" alt="图4.存储在Neo4j中的知识图的示例结构"></p>
<h3 id="C-评估指标"><a href="#C-评估指标" class="headerlink" title="C.评估指标"></a>C.评估指标</h3><p>在我们的实验中，我们采用了广泛使用的前N个推荐测量值，包括Precision，Recall，F1值，MAP和NDCG，以评估我们的方法以及基线。</p>
<ul>
<li>Precision @ N：这是与用户相关的建议项目中的一部分。我们计算所有用户的平均值作为最终精度。</li>
<li>Recall @ N：成功推荐与用户相关的项目的比例。我们计算所有用户的平均值作为最终召回率。</li>
<li>F1 @ N：它是N级精度和N级召回率的谐波均值</li>
<li>MAP @ N：通过考虑前N个项目列表所有位置的精度性能来计算平均平均精度（MAP）</li>
<li>NDCG @ N：归一化折现累积收益（NDCG）是排名质量的标准度量，考虑到排名列表中前N个正项和负项之间的分级相关性。</li>
</ul>
<p>前三种方法旨在评估推荐质量而不考虑排名位置，而后两种方法不仅评估准确性，还评估最终列表中正确项目的排名位置。</p>
<h3 id="D-BaseLine"><a href="#D-BaseLine" class="headerlink" title="D.BaseLine"></a>D.BaseLine</h3><p>我们将我们提出的方法与几种最新的推荐算法进行了比较。考虑到我们的方法结合了主题建模，协作过滤和知识图，我们选择的算法涵盖了基于内容的方法，基于CF的方法和基于KG的方法。</p>
<p>另外，对于第三方库推荐的情况，我们选择了AppLibRec [4]，[5]，它是最新的并且与我们的研究相对较近。</p>
<ul>
<li>LDA [8]：LDA是一种流行的主题建模技术，它以概率分布的形式给出文档集中每个文档的主题。在本文中，对应用程序和库的描述被视为LDA模型的输入。</li>
<li>CF：我们使用基于用户的协作过滤方法，该方法基于从交互矩阵计算出的相似度向应用程序推荐库。 </li>
<li>NCF [33]：通过将矩阵分解和MLP相结合来开发神经协作过滤（NCF）模型，以了解用户和项目对前N个推荐的偏好。</li>
<li>U-MKR：MKR [9]是一个深层的端到端框架，它利用知识图嵌入任务来辅助推荐任务。在本文中，U-MKR是基于用户的版本，它利用了应用程序的知识图嵌入</li>
<li>I-MKR：类似于U-MKR，I-MKR是MKR的基于项目的版本，我们使用库的知识图嵌入。</li>
<li>RippleNet [12]：RippleNet是一种类似于内存网络的方法，可以在知识图上传播用户的偏好</li>
<li>AppLibRec [4]，[5]：据我们所知，AppLibRec是针对移动应用程序的最新第三方库推荐方法。根据原始论文，参数α和β分别设置为0.3和0.7。</li>
</ul>
<h3 id="E-实验与评估"><a href="#E-实验与评估" class="headerlink" title="E.实验与评估"></a>E.实验与评估</h3><p>我们有兴趣回答以下研究问题，作为对我们研究的评估和讨论：</p>
<h4 id="1）RQ1：建议的TM-MKR是否优于最新的推荐方法？"><a href="#1）RQ1：建议的TM-MKR是否优于最新的推荐方法？" class="headerlink" title="1）RQ1：建议的TM-MKR是否优于最新的推荐方法？"></a>1）RQ1：建议的TM-MKR是否优于最新的推荐方法？</h4><p>图5展示了在五个评估指标上不同方法的性能。如我们所见，我们提出的TM-MKR方法在所有排名位置的所有竞争方法中表现最佳。</p>
<p>具体而言，与基于CF的方法（CF和NCF）相比，在Precision @ 5，Recall @ 5，F1 @ 5，MAP上，TM-MKR最多可增加26.9％，23.9％，25.4％，15.0％和17.6％。</p>
<p>与基于KGP的方法RippleNet相比，TM-MKR在Precision @ 5，Recall @ 5，F1 @ 5，MAP上分别超出了16.4％，11.7％，14.1％，16.1％和13.6％。 @ 5和NDCG @ 5。</p>
<p>与最新的第三方库推荐方法AppLibRec相比，TMCKR在Precision @ 5，Recall @ 5，F1 @ 5，MAP @ 5和NDCG @ 5上分别增长了25.2％，22.3％，23.7％，16.0％和16.4％，分别验证了我们结合知识图的假设。</p>
<p>对于选择不同的N值，所有方法的结果趋势基本相同，并且TM-MKR表现最佳。这些比较的结果证明了我们提出的TM-MKR方法的巨大有效性。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205103904921.png" alt="图5.数据集上前N个推荐的比较"></p>
<p>AppLibRec的性能比LDA和CF更好，这意味着同时使用主题和交互式信息比仅使用单个信息更有效。在四种非混合推荐方法（LDA，CF，NCF和RippleNet）中，RippleNet在几乎所有评估指标上表现最好，其次是NCF，最后是LDA和CF。</p>
<p>结果表明使用第三方库推荐任务中的知识图是非常有效的。此外，对于混合方法AppLibRec，即使它同时利用了文本描述和交互式信息，RippleNet仍然可以实现更好的性能，这进一步验证了我们结合知识图的假设。</p>
<h4 id="2）RQ2：对于提出的TM-MKR是否必须需要两个组件？"><a href="#2）RQ2：对于提出的TM-MKR是否必须需要两个组件？" class="headerlink" title="2）RQ2：对于提出的TM-MKR是否必须需要两个组件？"></a>2）RQ2：对于提出的TM-MKR是否必须需要两个组件？</h4><p>如前所述，建议的TM-MKR由两个组件组成：LDA模块和MKR模块。</p>
<p>为了证明这==两个组件的必要性==，我们分别在两个模块上进行了实验。</p>
<p>结果如图5所示。TM-MKR的性能优于LDA模块（即LDA）和MKR模块（即U-MKR和I-MKR）。</p>
<p>具体来说，在Precision @ 5，Recall @ 5，F1 @ 5，MAP @ 5和NDCG @ 5上，<br>TM-MKR的性能分别比LDA模块高26.9％，23.9％，25.4％，17.1％和17.7％。<br>与U-MKR和I-MKR相比，Precision @ 5，Recall @ 5，F1 @ 5，MAP @ 5和NDCG @ 5的方法分别提高了6.8％，7.1％，6.8％，7.2％和6.7％。</p>
<p>结果表明，MKR模块对推荐结果具有更好的提升效果，并且将LDA模块和MKR模块组合在一起是有效的，因为它在所有指标上都有改进。</p>
<p>我们拥有应用程序和库的文本信息，它们都可以用作训练LDA模型的语料库。</p>
<p>为了研究不同语料库对LDA模型的影响，我们选择了每个模型来训练LDA模型并观察其对LDA模块性能的影响。</p>
<p>根据表4所示的比较结果，我们发现==使用应用程序的描述作为语料，LDA模块比使用库的描述要好得多==。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205104456867.png" alt="表4. LDA的不同语料库的比较"></p>
<p>这个结果可以解释。在正常推荐情况下，我们通常可以推荐与其历史交互项相似的项。<br>库建议中不太可能发生这种情况。因为我们不太可能在我们的应用程序中已经使用过的库中使用类似的库。<br>更常见的情况是对于功能相似的应用程序，所使用的库也相对较近。<br>因此，对于新应用程序，推荐其邻居应用程序使用的库比推荐与其已使用的库相似的库更为合理。<br>这就是为什么我们选择应用程序的描述作为语料库来训练LDA模型来查找应用程序的邻居而不是库的邻居。</p>
<p>为了研究使用库和应用程序的知识图嵌入对TM-MKR性能的影响，我们进一步试验了==LDA与U-MKR和I-MKR的融合结果==，我们将它们分别表示为TM-UMKR和TM-IMKR。<br>从表5可以看出，融合结果基本接近，U-MKR略胜一筹，因此也用于TM-MKR。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205104737240.png" alt="表5. LDA与U-MKR和I-MKR的融合结果"></p>
<h4 id="3）RQ3：我们的模型对参数的敏感性如何？"><a href="#3）RQ3：我们的模型对参数的敏感性如何？" class="headerlink" title="3）RQ3：我们的模型对参数的敏感性如何？"></a>3）RQ3：我们的模型对参数的敏感性如何？</h4><p>为了回答这个问题，我们主要进行了==LDA模型的主题数==和==聚合器单元的融合率α==的实验。</p>
<p>图6显示了TM-MKR在不同主题编号上的性能。<br>结果表明，主题数量对TM-MKR的性能影响很小，因此我们的方法对于合理的范围内的不同主题数量是稳定的。<br>我们还可以发现，随着N的增加，精度和F1值逐渐降低，而查全率，MAP和NDCG则逐渐增加。这是因为在前N个推荐的情况下，用户的相关历史交互项的数量是有限的。<br>因此，最好为==建议选择较小的N值==。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205105016853.png" alt="图6. TM-MKR在不同主题编号上的性能"></p>
<p>为了选择主题数T，我们使用称为==主题一致性[34]的定量评估指标==进行评估。<br>我们使用的相干性度量是CV，它是根据滑动窗口，单词的一组分割以及使用归一化点向互信息（NPMI）和余弦相似度的间接确认度量计算得出的。<br>从图7可以看出，最佳主题当主题数设置为200时，可以获得连贯性。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205105216438.png" alt="图7.具有不同主题编号的LDA模型的主题一致性"></p>
<p>为了找到最佳融合比率，我们进行以下设置，将α的值从0更改为1，步长为0.1。</p>
<p>图8示出了实验结果。根据结果，聚合器单元中的α设置为0.5，这使得融合效果最佳。</p>
<p><img src="https://gitee.com/songx86/SongPicBed/raw/master/img/image-20201205105802619.png" alt="图8.所提出方法的不同α的Top-5结果"></p>
<h3 id="F-讨论与局限性分析"><a href="#F-讨论与局限性分析" class="headerlink" title="F.讨论与局限性分析"></a>F.讨论与局限性分析</h3><p>综上所述，在实验中，我们采用了五个评估指标来评估我们提出的TM-MKR方法的推荐性能。</p>
<p>在第一组实验中，我们表明TM-MKR在所有排名位置上均优于六种最新推荐算法。我们进一步分析了LDA模块和MKR模块的性能，发现MKR模块可以更好地提升结果。</p>
<p>我们还研究了语料库和主题编号对LDA模块中结果的影响，发现使用应用程序的文本描述效果更好，并且我们的方法对于不同主题编号也很稳定。</p>
<p>最后，我们找到了聚合器单元的最佳融合系数α。</p>
<p>尽管我们的方法效果不错，但有一个局限性，就是它没有考虑库的版本信息。</p>
<p>在某些情况下，库版本之间的差异很大。开发人员仅知道第三方库的名称是不够的。</p>
<p>为此，我们仍然需要进一步研究，希望能够在向开发人员提出建议时提供有关第三方库的详细信息，包括版本信息。</p>
<h2 id="6-总结展望"><a href="#6-总结展望" class="headerlink" title="6.总结展望"></a>6.总结展望</h2><p>在本文中，我们构建了一个包含移动应用程序的基本信息及其第三方库调用信息的真实数据集。</p>
<p>在此基础上，我们构建了一个包含应用程序和库的结构化语义信息的大规模领域知识图,并结合主题建模技术和基于知识图的方法提出了一种混合方法TM-MKR，为开发人员推荐库。</p>
<p>通过利用知识图嵌入技术，我们可以捕获项目本身的丰富辅助信息。</p>
<p>结合主题建模技术，我们还充分利用了非结构化的文本描述。</p>
<p>进行了广泛的实验以证明我们方法的有效性。</p>
<pre class="line-numbers language-mermaid" data-language="mermaid"><code class="language-mermaid"><span class="token keyword">graph</span>  LR<span class="token punctuation">;</span>
爬取数据集<span class="token arrow operator">--></span>文本描述<span class="token arrow operator">--></span>LDA主题模型<span class="token arrow operator">--></span>余弦相似度匹配<span class="token arrow operator">--></span>计算得分S_LDA<span class="token arrow operator">--></span>聚合单元
爬取数据集<span class="token arrow operator">--></span>结构化描述<span class="token arrow operator">--></span>构建知识图谱<span class="token arrow operator">--></span>MKR<span class="token arrow operator">--></span>计算得分S_MKR<span class="token arrow operator">--></span>聚合单元<span class="token arrow operator">--></span>最终得分Sl<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>





<p>将来，我们计划研究其他技术，例如深度学习以提取文本描述的语义信息。我们还将尝试一些新的基于KG的方法和融合方法，以获得更好的推荐结果。</p>
<h2 id="改进想法"><a href="#改进想法" class="headerlink" title="改进想法"></a>改进想法</h2><blockquote>
<p>（协同过滤混合？）</p>
</blockquote>
<p>左侧：文本描述中是否语义稀疏？解决文本描述中的语义稀疏问题</p>
<p>LDA改进，可以添加时序信息（库版本）；或者可以使用Tag标签来进行进一步的优化（是否和右面的KG重复？）LLDA</p>
<p>右侧：MLP特征提取改进；</p>
<p>加模块，第三个分数；</p>
<p>聚合器模块？协同过滤？</p>

                
            </div>
            <hr/>

            

    <div class="reprint" id="reprint-statement">
        
            <div class="reprint__author">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-user">
                        文章作者:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="/about" rel="external nofollow noreferrer">SongX64</a>
                </span>
            </div>
            <div class="reprint__type">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-link">
                        文章链接:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="https://songx86.gitee.io/article/42584db7.html">https://songx86.gitee.io/article/42584db7.html</a>
                </span>
            </div>
            <div class="reprint__notice">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-copyright">
                        版权声明:
                    </i>
                </span>
                <span class="reprint-info">
                    本博客所有文章除特別声明外，均采用
                    <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="external nofollow noreferrer" target="_blank">CC BY 4.0</a>
                    许可协议。转载请注明来源
                    <a href="/about" target="_blank">SongX64</a>
                    !
                </span>
            </div>
        
    </div>

    <script async defer>
      document.addEventListener("copy", function (e) {
        let toastHTML = '<span>复制成功，请遵循本文的转载规则</span><button class="btn-flat toast-action" onclick="navToReprintStatement()" style="font-size: smaller">查看</a>';
        M.toast({html: toastHTML})
      });

      function navToReprintStatement() {
        $("html, body").animate({scrollTop: $("#reprint-statement").offset().top - 80}, 800);
      }
    </script>



            <div class="tag_share" style="display: block;">
                <div class="post-meta__tag-list" style="display: inline-block;">
                    
                        <div class="article-tag">
                            
                                <a href="/tags/%E7%A7%91%E7%A0%94/">
                                    <span class="chip bg-color">科研</span>
                                </a>
                            
                                <a href="/tags/Knowledge-Graph/">
                                    <span class="chip bg-color">Knowledge Graph</span>
                                </a>
                            
                                <a href="/tags/%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91/">
                                    <span class="chip bg-color">论文翻译</span>
                                </a>
                            
                                <a href="/tags/Recommendation/">
                                    <span class="chip bg-color">Recommendation</span>
                                </a>
                            
                        </div>
                    
                </div>
                <div class="post_share" style="zoom: 80%; width: fit-content; display: inline-block; float: right; margin: -0.15rem 0;">
                    <link rel="stylesheet" type="text/css" href="/libs/share/css/share.min.css">
<div id="article-share">

    
    <div class="social-share" data-sites="twitter,facebook,google,qq,qzone,wechat,weibo,douban,linkedin" data-wechat-qrcode-helper="<p>微信扫一扫即可分享！</p>"></div>
    <script src="/libs/share/js/social-share.min.js"></script>
    

    

</div>

                </div>
            </div>
            
                <style>
    #reward {
        margin: 40px 0;
        text-align: center;
    }

    #reward .reward-link {
        font-size: 1.4rem;
        line-height: 38px;
    }

    #reward .btn-floating:hover {
        box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2), 0 5px 15px rgba(0, 0, 0, 0.2);
    }

    #rewardModal {
        width: 320px;
        height: 350px;
    }

    #rewardModal .reward-title {
        margin: 15px auto;
        padding-bottom: 5px;
    }

    #rewardModal .modal-content {
        padding: 10px;
    }

    #rewardModal .close {
        position: absolute;
        right: 15px;
        top: 15px;
        color: rgba(0, 0, 0, 0.5);
        font-size: 1.3rem;
        line-height: 20px;
        cursor: pointer;
    }

    #rewardModal .close:hover {
        color: #ef5350;
        transform: scale(1.3);
        -moz-transform:scale(1.3);
        -webkit-transform:scale(1.3);
        -o-transform:scale(1.3);
    }

    #rewardModal .reward-tabs {
        margin: 0 auto;
        width: 210px;
    }

    .reward-tabs .tabs {
        height: 38px;
        margin: 10px auto;
        padding-left: 0;
    }

    .reward-content ul {
        padding-left: 0 !important;
    }

    .reward-tabs .tabs .tab {
        height: 38px;
        line-height: 38px;
    }

    .reward-tabs .tab a {
        color: #fff;
        background-color: #ccc;
    }

    .reward-tabs .tab a:hover {
        background-color: #ccc;
        color: #fff;
    }

    .reward-tabs .wechat-tab .active {
        color: #fff !important;
        background-color: #22AB38 !important;
    }

    .reward-tabs .alipay-tab .active {
        color: #fff !important;
        background-color: #019FE8 !important;
    }

    .reward-tabs .reward-img {
        width: 210px;
        height: 210px;
    }
</style>

<div id="reward">
    <a href="#rewardModal" class="reward-link modal-trigger btn-floating btn-medium waves-effect waves-light red">赏</a>

    <!-- Modal Structure -->
    <div id="rewardModal" class="modal">
        <div class="modal-content">
            <a class="close modal-close"><i class="fas fa-times"></i></a>
            <h4 class="reward-title">你的赏识是我前进的动力</h4>
            <div class="reward-content">
                <div class="reward-tabs">
                    <ul class="tabs row">
                        <li class="tab col s6 alipay-tab waves-effect waves-light"><a href="#alipay">支付宝</a></li>
                        <li class="tab col s6 wechat-tab waves-effect waves-light"><a href="#wechat">微 信</a></li>
                    </ul>
                    <div id="alipay">
                        <img src="/medias/reward/alipay.jpg" class="reward-img" alt="支付宝打赏二维码">
                    </div>
                    <div id="wechat">
                        <img src="/medias/reward/wechat.jpg" class="reward-img" alt="微信打赏二维码">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
    $(function () {
        $('.tabs').tabs();
    });
</script>

            
        </div>
    </div>

    

    

    

    

    
        <style>
    .valine-card {
        margin: 1.5rem auto;
    }

    .valine-card .card-content {
        padding: 20px 20px 5px 20px;
    }

    #vcomments textarea {
        box-sizing: border-box;
        background: url("/medias/comment_bg.png") 100% 100% no-repeat;
    }

    #vcomments p {
        margin: 2px 2px 10px;
        font-size: 1.05rem;
        line-height: 1.78rem;
    }

    #vcomments blockquote p {
        text-indent: 0.2rem;
    }

    #vcomments a {
        padding: 0 2px;
        color: #4cbf30;
        font-weight: 500;
        text-decoration: none;
    }

    #vcomments img {
        max-width: 100%;
        height: auto;
        cursor: pointer;
    }

    #vcomments ol li {
        list-style-type: decimal;
    }

    #vcomments ol,
    ul {
        display: block;
        padding-left: 2em;
        word-spacing: 0.05rem;
    }

    #vcomments ul li,
    ol li {
        display: list-item;
        line-height: 1.8rem;
        font-size: 1rem;
    }

    #vcomments ul li {
        list-style-type: disc;
    }

    #vcomments ul ul li {
        list-style-type: circle;
    }

    #vcomments table, th, td {
        padding: 12px 13px;
        border: 1px solid #dfe2e5;
    }

    #vcomments table, th, td {
        border: 0;
    }

    table tr:nth-child(2n), thead {
        background-color: #fafafa;
    }

    #vcomments table th {
        background-color: #f2f2f2;
        min-width: 80px;
    }

    #vcomments table td {
        min-width: 80px;
    }

    #vcomments h1 {
        font-size: 1.85rem;
        font-weight: bold;
        line-height: 2.2rem;
    }

    #vcomments h2 {
        font-size: 1.65rem;
        font-weight: bold;
        line-height: 1.9rem;
    }

    #vcomments h3 {
        font-size: 1.45rem;
        font-weight: bold;
        line-height: 1.7rem;
    }

    #vcomments h4 {
        font-size: 1.25rem;
        font-weight: bold;
        line-height: 1.5rem;
    }

    #vcomments h5 {
        font-size: 1.1rem;
        font-weight: bold;
        line-height: 1.4rem;
    }

    #vcomments h6 {
        font-size: 1rem;
        line-height: 1.3rem;
    }

    #vcomments p {
        font-size: 1rem;
        line-height: 1.5rem;
    }

    #vcomments hr {
        margin: 12px 0;
        border: 0;
        border-top: 1px solid #ccc;
    }

    #vcomments blockquote {
        margin: 15px 0;
        border-left: 5px solid #42b983;
        padding: 1rem 0.8rem 0.3rem 0.8rem;
        color: #666;
        background-color: rgba(66, 185, 131, .1);
    }

    #vcomments pre {
        font-family: monospace, monospace;
        padding: 1.2em;
        margin: .5em 0;
        background: #272822;
        overflow: auto;
        border-radius: 0.3em;
        tab-size: 4;
    }

    #vcomments code {
        font-family: monospace, monospace;
        padding: 1px 3px;
        font-size: 0.92rem;
        color: #e96900;
        background-color: #f8f8f8;
        border-radius: 2px;
    }

    #vcomments pre code {
        font-family: monospace, monospace;
        padding: 0;
        color: #e8eaf6;
        background-color: #272822;
    }

    #vcomments pre[class*="language-"] {
        padding: 1.2em;
        margin: .5em 0;
    }

    #vcomments code[class*="language-"],
    pre[class*="language-"] {
        color: #e8eaf6;
    }

    #vcomments [type="checkbox"]:not(:checked), [type="checkbox"]:checked {
        position: inherit;
        margin-left: -1.3rem;
        margin-right: 0.4rem;
        margin-top: -1px;
        vertical-align: middle;
        left: unset;
        visibility: visible;
    }

    #vcomments b,
    strong {
        font-weight: bold;
    }

    #vcomments dfn {
        font-style: italic;
    }

    #vcomments small {
        font-size: 85%;
    }

    #vcomments cite {
        font-style: normal;
    }

    #vcomments mark {
        background-color: #fcf8e3;
        padding: .2em;
    }

    #vcomments table, th, td {
        padding: 12px 13px;
        border: 1px solid #dfe2e5;
    }

    table tr:nth-child(2n), thead {
        background-color: #fafafa;
    }

    #vcomments table th {
        background-color: #f2f2f2;
        min-width: 80px;
    }

    #vcomments table td {
        min-width: 80px;
    }

    #vcomments [type="checkbox"]:not(:checked), [type="checkbox"]:checked {
        position: inherit;
        margin-left: -1.3rem;
        margin-right: 0.4rem;
        margin-top: -1px;
        vertical-align: middle;
        left: unset;
        visibility: visible;
    }
</style>

<div class="card valine-card" data-aos="fade-up">
    <div class="comment_headling" style="font-size: 20px; font-weight: 700; position: relative; padding-left: 20px; top: 15px; padding-bottom: 5px;">
        <i class="fas fa-comments fa-fw" aria-hidden="true"></i>
        <span>评论</span>
    </div>
    <div id="vcomments" class="card-content" style="display: grid">
    </div>
</div>

<script src="/libs/valine/av-min.js"></script>
<script src="/libs/valine/Valine.min.js"></script>
<script>
    new Valine({
        el: '#vcomments',
        appId: 'gRuzkj3uDnUjERvWlFkWkYjF-gzGzoHsz',
        appKey: 'tCCMKQDflcsl0hOAh2CUfvPP',
        notify: 'false' === 'true',
        verify: 'false' === 'true',
        visitor: 'true' === 'true',
        avatar: 'mm',
        pageSize: '10',
        lang: 'zh-cn',
        placeholder: 'just go go'
    });
</script>

<!--酷Q推送-->


    

    

    

    

    

<article id="prenext-posts" class="prev-next articles">
    <div class="row article-row">
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge left-badge text-color">
                <i class="fas fa-chevron-left"></i>&nbsp;上一篇</div>
            <div class="card">
                <a href="/article/ac76982b.html">
                    <div class="card-image">
                        
                        
                        <img src="/medias/featureimages/101.jpg" class="responsive-img" alt="超越数据集学习：用于自然语言处理的知识图增强神经网络">
                        
                        <span class="card-title">超越数据集学习：用于自然语言处理的知识图增强神经网络</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            超越数据集学习：用于自然语言处理的知识图增强神经网络，没太看懂，貌似是提出一个框架性的东西，还待精读
                        
                    </div>
                    <div class="publish-info">
                        <span class="publish-date">
                            <i class="far fa-clock fa-fw icon-date"></i>2021-03-09
                        </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/categories/%E7%A7%91%E7%A0%94/" class="post-category">
                                    科研
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/tags/%E7%A7%91%E7%A0%94/">
                        <span class="chip bg-color">科研</span>
                    </a>
                    
                    <a href="/tags/Knowledge-Graph/">
                        <span class="chip bg-color">Knowledge Graph</span>
                    </a>
                    
                    <a href="/tags/%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91/">
                        <span class="chip bg-color">论文翻译</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge right-badge text-color">
                下一篇&nbsp;<i class="fas fa-chevron-right"></i>
            </div>
            <div class="card">
                <a href="/article/d269d089.html">
                    <div class="card-image">
                        
                        
                        <img src="/medias/featureimages/101.jpg" class="responsive-img" alt="简单理解IOC与AOP">
                        
                        <span class="card-title">简单理解IOC与AOP</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            简单理解控制反转与面向切面编程思想。
                        
                    </div>
                    <div class="publish-info">
                            <span class="publish-date">
                                <i class="far fa-clock fa-fw icon-date"></i>2021-02-17
                            </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/categories/%E5%90%8E%E7%AB%AF/" class="post-category">
                                    后端
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/tags/Java/">
                        <span class="chip bg-color">Java</span>
                    </a>
                    
                    <a href="/tags/Springboot/">
                        <span class="chip bg-color">Springboot</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
    </div>
</article>

</div>



<!-- 代码块功能依赖 -->
<script type="text/javascript" src="/libs/codeBlock/codeBlockFuction.js"></script>

<!-- 代码语言 -->

<script type="text/javascript" src="/libs/codeBlock/codeLang.js"></script>


<!-- 代码块复制 -->

<script type="text/javascript" src="/libs/codeBlock/codeCopy.js"></script>


<!-- 代码块收缩 -->

<script type="text/javascript" src="/libs/codeBlock/codeShrink.js"></script>


    </div>
    <div id="toc-aside" class="expanded col l3 hide-on-med-and-down">
        <div class="toc-widget card" style="background-color: white;">
            <div class="toc-title"><i class="far fa-list-alt"></i>&nbsp;&nbsp;目录</div>
            <div id="toc-content"></div>
        </div>
    </div>
</div>

<!-- TOC 悬浮按钮. -->

<div id="floating-toc-btn" class="hide-on-med-and-down">
    <a class="btn-floating btn-large bg-color">
        <i class="fas fa-list-ul"></i>
    </a>
</div>


<script src="/libs/tocbot/tocbot.min.js"></script>
<script>
    $(function () {
        tocbot.init({
            tocSelector: '#toc-content',
            contentSelector: '#articleContent',
            headingsOffset: -($(window).height() * 0.4 - 45),
            collapseDepth: Number('0'),
            headingSelector: 'h2, h3, h4'
        });

        // modify the toc link href to support Chinese.
        let i = 0;
        let tocHeading = 'toc-heading-';
        $('#toc-content a').each(function () {
            $(this).attr('href', '#' + tocHeading + (++i));
        });

        // modify the heading title id to support Chinese.
        i = 0;
        $('#articleContent').children('h2, h3, h4').each(function () {
            $(this).attr('id', tocHeading + (++i));
        });

        // Set scroll toc fixed.
        let tocHeight = parseInt($(window).height() * 0.4 - 64);
        let $tocWidget = $('.toc-widget');
        $(window).scroll(function () {
            let scroll = $(window).scrollTop();
            /* add post toc fixed. */
            if (scroll > tocHeight) {
                $tocWidget.addClass('toc-fixed');
            } else {
                $tocWidget.removeClass('toc-fixed');
            }
        });

        
        /* 修复文章卡片 div 的宽度. */
        let fixPostCardWidth = function (srcId, targetId) {
            let srcDiv = $('#' + srcId);
            if (srcDiv.length === 0) {
                return;
            }

            let w = srcDiv.width();
            if (w >= 450) {
                w = w + 21;
            } else if (w >= 350 && w < 450) {
                w = w + 18;
            } else if (w >= 300 && w < 350) {
                w = w + 16;
            } else {
                w = w + 14;
            }
            $('#' + targetId).width(w);
        };

        // 切换TOC目录展开收缩的相关操作.
        const expandedClass = 'expanded';
        let $tocAside = $('#toc-aside');
        let $mainContent = $('#main-content');
        $('#floating-toc-btn .btn-floating').click(function () {
            if ($tocAside.hasClass(expandedClass)) {
                $tocAside.removeClass(expandedClass).hide();
                $mainContent.removeClass('l9');
            } else {
                $tocAside.addClass(expandedClass).show();
                $mainContent.addClass('l9');
            }
            fixPostCardWidth('artDetail', 'prenext-posts');
        });
        
    });
</script>

    

</main>




    <footer class="page-footer bg-color">
    
        <link rel="stylesheet" href="/libs/aplayer/APlayer.min.css">
<style>
    .aplayer .aplayer-lrc p {
        
        display: none;
        
        font-size: 12px;
        font-weight: 700;
        line-height: 16px !important;
    }

    .aplayer .aplayer-lrc p.aplayer-lrc-current {
        
        display: none;
        
        font-size: 15px;
        color: #42b983;
    }

    
    .aplayer.aplayer-fixed.aplayer-narrow .aplayer-body {
        left: -66px !important;
    }

    .aplayer.aplayer-fixed.aplayer-narrow .aplayer-body:hover {
        left: 0px !important;
    }

    
</style>
<div class="">
    
    <div class="row">
        <meting-js class="col l8 offset-l2 m10 offset-m1 s12"
                   server="netease"
                   type="playlist"
                   id="767683882"
                   fixed='true'
                   autoplay='false'
                   theme='#42b983'
                   loop='all'
                   order='random'
                   preload='auto'
                   volume='0.7'
                   list-folded='true'
        >
        </meting-js>
    </div>
</div>

<script src="/libs/aplayer/APlayer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js"></script>

    
    <div class="container row center-align" style="margin-bottom: 0px !important;">
        <div class="col s12 m8 l8 copy-right">
            Copyright&nbsp;&copy;
            
                <span id="year">2020-2021</span>
            
            <span id="year">2020</span>
            <a href="/about" target="_blank">SongX64</a>
            |&nbsp;Powered by&nbsp;<a href="https://hexo.io/" target="_blank">Hexo</a>
            |&nbsp;Theme&nbsp;<a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a>
			<br>
				<a href="https://beian.miit.gov.cn/" target="_blank">鲁ICP备2021015839号-1</a>
				 | 
				<img src="/medias/icp.png" style="vertical-align: text-bottom;" />
		 		<a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=37083102000087">鲁公网安备 37083102000087号</a>
            </span>
			
		 
            <br>
            
            
            
            
            
            <br>
            
            <br>
            
        </div>
        <div class="col s12 m4 l4 social-link ">
    <a href="https://github.com/SongX64" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50">
        <i class="fab fa-github"></i>
    </a>



    <a href="mailto:song.x64@gmail.com" class="tooltipped" target="_blank" data-tooltip="邮件联系我" data-position="top" data-delay="50">
        <i class="fas fa-envelope-open"></i>
    </a>







    <a href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=song-x64@qq.com" class="tooltipped" target="_blank" data-tooltip="QQ联系我: song-x64@qq.com" data-position="top" data-delay="50">
        <i class="fab fa-qq"></i>
    </a>







</div>
    </div>
</footer>

<div class="progress-bar"></div>


    <!-- 搜索遮罩框 -->
<div id="searchModal" class="modal">
    <div class="modal-content">
        <div class="search-header">
            <span class="title"><i class="fas fa-search"></i>&nbsp;&nbsp;搜索</span>
            <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字"
                   class="search-input">
        </div>
        <div id="searchResult"></div>
    </div>
</div>

<script type="text/javascript">
$(function () {
    var searchFunc = function (path, search_id, content_id) {
        'use strict';
        $.ajax({
            url: path,
            dataType: "xml",
            success: function (xmlResponse) {
                // get the contents from search data
                var datas = $("entry", xmlResponse).map(function () {
                    return {
                        title: $("title", this).text(),
                        content: $("content", this).text(),
                        url: $("url", this).text()
                    };
                }).get();
                var $input = document.getElementById(search_id);
                var $resultContent = document.getElementById(content_id);
                $input.addEventListener('input', function () {
                    var str = '<ul class=\"search-result-list\">';
                    var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/);
                    $resultContent.innerHTML = "";
                    if (this.value.trim().length <= 0) {
                        return;
                    }
                    // perform local searching
                    datas.forEach(function (data) {
                        var isMatch = true;
                        var data_title = data.title.trim().toLowerCase();
                        var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase();
                        var data_url = data.url;
                        data_url = data_url.indexOf('/') === 0 ? data.url : '/' + data_url;
                        var index_title = -1;
                        var index_content = -1;
                        var first_occur = -1;
                        // only match artiles with not empty titles and contents
                        if (data_title !== '' && data_content !== '') {
                            keywords.forEach(function (keyword, i) {
                                index_title = data_title.indexOf(keyword);
                                index_content = data_content.indexOf(keyword);
                                if (index_title < 0 && index_content < 0) {
                                    isMatch = false;
                                } else {
                                    if (index_content < 0) {
                                        index_content = 0;
                                    }
                                    if (i === 0) {
                                        first_occur = index_content;
                                    }
                                }
                            });
                        }
                        // show search results
                        if (isMatch) {
                            str += "<li><a href='" + data_url + "' class='search-result-title'>" + data_title + "</a>";
                            var content = data.content.trim().replace(/<[^>]+>/g, "");
                            if (first_occur >= 0) {
                                // cut out 100 characters
                                var start = first_occur - 20;
                                var end = first_occur + 80;
                                if (start < 0) {
                                    start = 0;
                                }
                                if (start === 0) {
                                    end = 100;
                                }
                                if (end > content.length) {
                                    end = content.length;
                                }
                                var match_content = content.substr(start, end);
                                // highlight all keywords
                                keywords.forEach(function (keyword) {
                                    var regS = new RegExp(keyword, "gi");
                                    match_content = match_content.replace(regS, "<em class=\"search-keyword\">" + keyword + "</em>");
                                });

                                str += "<p class=\"search-result\">" + match_content + "...</p>"
                            }
                            str += "</li>";
                        }
                    });
                    str += "</ul>";
                    $resultContent.innerHTML = str;
                });
            }
        });
    };

    searchFunc('/search.xml', 'searchInput', 'searchResult');
});
</script>

    <!-- 回到顶部按钮 -->
<div id="backTop" class="top-scroll">
    <a class="btn-floating btn-large waves-effect waves-light" href="#!">
        <i class="fas fa-arrow-up"></i>
    </a>
</div>


    <script src="/libs/materialize/materialize.min.js"></script>
    <script src="/libs/masonry/masonry.pkgd.min.js"></script>
    <script src="/libs/aos/aos.js"></script>
    <script src="/libs/scrollprogress/scrollProgress.min.js"></script>
    <script src="/libs/lightGallery/js/lightgallery-all.min.js"></script>
    <script src="/js/matery.js"></script>

    <!-- Baidu Analytics -->

    <!-- Baidu Push -->

<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        } else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>

    
    <script src="/libs/others/clicklove.js" async="async"></script>
    
    

    

    

    <!--腾讯兔小巢-->
    
        <div style="position:fixed;bottom:125px;right:16px;cursor: pointer;">
            <a title="兔小巢" target="_blank" rel="noopener" href="https://support.qq.com/products/330452"><i class="fa fa-comments fa-3x"  aria-hidden="true"></i></a>
        </div>
    
    
    <script type="text/javascript" color="0,0,255"
        pointColor="0,0,255" opacity='0.5'
        zIndex="-1" count="99"
        src="/libs/background/canvas-nest.js"></script>
    

    

    
    <script type="text/javascript" src="/libs/background/ribbon-dynamic.js" async="async"></script>
    

    
    <script src="/libs/instantpage/instantpage.js" type="module"></script>
    

<script src="/live2dw/lib/L2Dwidget.min.js?094cbace49a39548bed64abff5988b05"></script><script>L2Dwidget.init({"pluginRootPath":"live2dw/","pluginJsPath":"lib/","pluginModelPath":"assets/","tagMode":false,"log":false,"model":{"jsonPath":"/live2dw/assets/shizuku.model.json"},"display":{"position":"right","width":150,"height":300},"mobile":{"show":true},"react":{"opacity":0.7}});</script></body>

</html>
